package com.ExcelServer.controller;

import com.ExcelServer.common.Result;
import com.ExcelServer.listen.NoModelDataListener;
import com.ExcelServer.pojo.form.add.AddOneExcelRulerForm;
import com.ExcelServer.pojo.form.delete.DeleteExcelForm;
import com.ExcelServer.pojo.form.update.UpdateExcelForm;
import com.ExcelServer.pojo.form.update.UpdateExcelRulesForm;
import com.ExcelServer.pojo.query.ExcelInfoQuery;
import com.ExcelServer.pojo.query.ExcelRulersQuery;
import com.ExcelServer.pojo.query.TableInfoQuery;
import com.ExcelServer.pojo.vo.ExcelInfoVo;
import com.ExcelServer.service.impl.ExcelCreateInfoServiceImpl;
import com.ExcelServer.service.impl.ExcelQueryRulesServiceImpl;
import com.ExcelServer.service.impl.ExcelRulesServiceImpl;
import com.alibaba.excel.EasyExcel;

import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;


@RestController
@RequestMapping("/se/excel/info")
@Hidden
@Tag(name = "excel",description = "excel->table")
public class ExcelController {

    @Autowired
    ExcelCreateInfoServiceImpl excelCreateInfoService;

    @Autowired
    ExcelRulesServiceImpl excelRulesService;

    @Autowired
    ExcelQueryRulesServiceImpl excelQueryRulesService;

    /***
     * 注意：解析比较耗费内存！！！并没有直接入库。excel过大，内容过多可能会导致系统内存不足，系统宕机。
     * **/
//    @ApiOperation("解析")
    @Operation(summary = "解析",description = "解析")
    @PostMapping("/parsing")
    public Result upload(@RequestParam("file") MultipartFile file) {
        try {
            InputStream inputStream = file.getInputStream();

            String name = file.getOriginalFilename();
            NoModelDataListener noModelDataListener = new NoModelDataListener();
            EasyExcel.read(inputStream, noModelDataListener).sheet().doRead();
            List list = noModelDataListener.getDateList();
            ExcelInfoVo excelInfoVo = new ExcelInfoVo();
            excelInfoVo.setList(list);
            excelInfoVo.setName(name);

            //返回解析之后的结果
            return Result.success(excelInfoVo);
        } catch (IOException e) {
            e.printStackTrace();
            return Result.fail("系统错误，数据解析出错");
        }

    }

    /***
     * 信息入库。将解析之后的数据（若是不正确，介入人工修改）入库
     *
     * **/
//    @ApiOperation("入库")
    @Operation(summary = "入库",description = "入库")
    @PostMapping("/input")
    public Result input(@RequestBody ExcelInfoQuery excelInfoQuery) {
        //应该加锁？不加锁？这是一个值得探讨的问题 //TODO 加原子锁
//        synchronized (this){ }

        int input = excelCreateInfoService.input(excelInfoQuery);
        if (input > 0) {
            return Result.success("写入成功");
        }
        return Result.fail( "写入失败");
    }


    /***
     * 获取全部excel粗略信息
     *
     * **/
//    @ApiOperation("获取excel粗略信息")
    @Operation(summary = "获取excel粗略信息",description = "获取excel粗略信息")
    @PostMapping("/getExcelListInfo")
    public Result getList() {
        return excelCreateInfoService.getExcelListInfo();
    }

    /***
     * 获取具体(ById)某个excel详细信息
     * 流程：
     * 寻找规则表是否存在表格自动计算的规则
     * 若是存在规则，按照规则添加改动数据
     * 不存在则直接返回表格内容。
     * **/
//    @ApiOperation("获取excel详细信息")
    @Operation(summary = "获取excel详细信息",description = "获取excel详细信息")
    @PostMapping("/getExcelInfoById")
    public Result getExcelInfoById(@RequestBody TableInfoQuery id) {
        return excelCreateInfoService.getExcelInfoById(id);
    }

    /***
     * 修改具体某个excel详细信息
     *
     * **/
//    @ApiOperation("修改excel详细信息")
    @Operation(summary = "修改excel详细信息",description = "修改excel详细信息")
    @PostMapping("/updateExcelInfoById")
    public Result updateExcelInfoById(@RequestBody UpdateExcelForm updateExcelForm) {
        return excelCreateInfoService.updateExcelInfoById(updateExcelForm);
    }


    /***
     * 删除某个excel
     *若是
     * **/
//    @ApiOperation("删除具体某个excel")
    @Operation(summary = "删除具体某个excel",description = "删除具体某个excel")
    @DeleteMapping("/deleteExcelById/{tableId}")
    public Result deleteExcelById(@PathVariable String tableId) {
        return excelCreateInfoService.deleteExcelById(tableId);
    }

    /***
     * 删除某个excel
     *若是
     * **/
//    @ApiOperation("删除具体某个excel（强制删除） ")
    @Operation(summary = "删除具体某个excel（强制删除）",description = "删除具体某个excel（强制删除）")
    @DeleteMapping("/deleteExcelByIdF/{tableId}")
    public Result deleteExcelByIdF(@PathVariable String tableId) {
        return excelCreateInfoService.deleteExcelByIdF(tableId);
    }

    /***
     * 删除具体某个excel详细信息
     *
     * **/
//    @ApiOperation("删除单条excel详细信息")
    @Operation(summary = "删除单条excel详细信息）",description = "删除单条excel详细信息")
    @PostMapping("/deleteExcelInfoById")
    public Result deleteExcelInfoById(@RequestBody DeleteExcelForm deleteExcelForm) {
        return excelCreateInfoService.deleteExcelInfoById(deleteExcelForm);
    }


    /***
     * 获取具体(ByTableName)某个excel详细信息
     * 流程：
     * 寻找规则表是否存在表格自动计算的规则
     * 若是存在规则，按照规则添加改动数据
     * 不存在则直接返回表格内容。
     * **/
//    @ApiOperation("//通过mysql-table名称获取具体某个excel详细信息")
//    @Operation(summary = "//通过mysql-table名称获取具体某个excel详细信息）",description = "//通过mysql-table名称获取具体某个excel详细信息")
//    @PostMapping("/getExcelInfoByByTableName")
//    public Result getExcelInfoByByTableName(@RequestBody TableNameQuery tableName) {
//        return excelCreateInfoService.getExcelInfoByByTableName(tableName.getTableName());
//    }

    /***
     * 为具体某个excel添加 规则
     * 要求：1.必须存在该表
     *      2.添加规则的过程中需要验证规则是否合法 (采用流程：获取具体表 字段，根据字段类类型，
     *      模拟生成随机数，根据随机数值进行异常模拟)
     *      3.保证添加的规则对系统安全无（少）影响，不会破坏原有数据表的内容。
     *      4.规则应该是可控的。
     * **/
//    @ApiOperation("添加excel自动计算规则")
    @Operation(summary = "添加excel自动计算规则）",description = "添加excel自动计算规则")
    @PostMapping("/addExcelRuleByTableId")
    public Result addExcelRuleById(@RequestBody AddOneExcelRulerForm addOneExcelRulerForm) {
        return excelCreateInfoService.addExcelRuleById(addOneExcelRulerForm);
    }

    /***
     *
     ***/
//    @ApiOperation("查看excel表格自动计算规则")
    @Operation(summary = "查看excel表格自动计算规则）",description = "查看excel表格自动计算规则")
    @PostMapping("/getExcelRule")
    public Result getExcelRule(@RequestBody ExcelRulersQuery excelRulersQuery) {
        return excelRulesService.getExcelRule(excelRulersQuery);
    }

    /***
     *
     ***/
//    @ApiOperation("删除excel自动计算规则")
    @Operation(summary = "删除excel自动计算规则）",description = "删除excel自动计算规则")
    @DeleteMapping("/delExcelRuleByTableIdAndRulerId/{id}")
    public Result delExcelRuleById(@PathVariable String id) {
        boolean b = excelRulesService.removeById(id);
        if (b) {
            Result.success("删除成功");
        }
        return Result.fail("删除失败");
    }

    /***
     *
     ***/
//    @ApiOperation("修改excel自动计算规则")
    @Operation(summary = "修改excel自动计算规则）",description = "修改excel自动计算规则")
    @PostMapping("/updateExcelRuleByTableIdAndRulerId")
    public Result updateExcelRuleById(@RequestBody UpdateExcelRulesForm updateExcelRulesForm) {
        return excelRulesService.updateRuler(updateExcelRulesForm);
    }


}
